#include "BlockQueue.hpp"
#include "Task.hpp"
int myAdd(int x, int y)
{
    return x + y;
}
void *consumer(void *args)
{
    BlockQueue<Task> *bqueue = (BlockQueue<Task> *)args;
    while (true)
    {
        // 获取任务
        Task t;
        bqueue->pop(&t); // 消费者拿到数据，如果没有数据，消费者线程就阻塞在pop接口里
        // cout << "消费了一个数据" << a << endl;
        // 完成任务
        cout << t.getX() << "+" << t.getY() << "=" << t() << endl;
        sleep(1);
    }
    return nullptr;
}
// int a = 100;
void *productor(void *args)
{
    BlockQueue<Task> *bqueue = (BlockQueue<Task> *)args;
    while (true)
    {
        int x = rand() % 10 + 1;
        usleep(rand() % 1000);
        int y = rand() % 5 + 1;
        Task t(x, y, myAdd);

        bqueue->push(t); // 生产者生产数据，生产者看到数据满的时候，生产者线程就阻塞在这个push接口
        // cout << "生产了一个数据: " << a << endl;
        //  a++;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    srand((uint64_t)time(nullptr) ^ getpid() ^ 0x42343241);
    // 让两个线程看到同一个队列
    BlockQueue<Task> *bqueue = new BlockQueue<Task>();
    pthread_t c, p;
    pthread_create(&c, nullptr, consumer, (void *)bqueue);
    pthread_create(&p, nullptr, productor, (void *)bqueue);
    pthread_join(c, nullptr);
    pthread_join(p, nullptr);
    return 0;
}